﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Caching;
using RogerioCoimbra.DivulgacaoEspirita.Dominio.Repositorio;
using RogerioCoimbra.DivulgacaoEspirita.Dominio.Entidade;

namespace RogerioCoimbra.DivulgacaoEspirita.Site.Aplicacao.Pagina
{
	public static class Default
	{
		const int ComprimentoMaximoConteudo = 270;

		#region Propriedades 
		public static string Aviso
		{
			get
			{
				object aviso = HttpContext.Current.Cache["Aviso"];

				if (aviso == null)
				{
					CarregarAviso();
					aviso = HttpContext.Current.Cache["Aviso"];
				}

				return aviso.ToString();
			}
		}

		public static string Endereco
		{
			get
			{
				object endereco = HttpContext.Current.Cache["Endereco"];

				if (endereco == null)
				{
					CarregarEndereco();
					endereco = HttpContext.Current.Cache["Endereco"];
				}

				return endereco.ToString();
			}
		}

		public static int FraseId
		{
			get
			{
				object fraseId = HttpContext.Current.Cache["FraseId"];

				if (fraseId == null)
				{
					CarregarFrase();
					fraseId = HttpContext.Current.Cache["FraseId"];
				}

				return int.Parse(fraseId.ToString());
			}
		}

		public static int FraseAutorId
		{
			get
			{
				object fraseAutorId = HttpContext.Current.Cache["FraseAutorId"];

				if (fraseAutorId == null)
				{
					CarregarFrase();
					fraseAutorId = HttpContext.Current.Cache["FraseAutorId"];
				}

				return int.Parse(fraseAutorId.ToString());
			}
		}

		public static string FraseConteudo
		{
			get
			{
				object conteudo = HttpContext.Current.Cache["FraseConteudo"];

				if (conteudo == null)
				{
					CarregarFrase();
					conteudo = HttpContext.Current.Cache["FraseConteudo"];
				}

				return conteudo.ToString();
			}
		}

		public static string FraseAutorDatas
		{
			get
			{
				object autorDatas = HttpContext.Current.Cache["FraseAutorDatas"];

				if (autorDatas == null)
				{
					CarregarFrase();
					autorDatas = HttpContext.Current.Cache["FraseAutorDatas"];
				}

				return autorDatas.ToString();
			}
		} 
		#endregion

		#region Operações 
		private static void CarregarAviso()
		{
			//Escreve no cache.
			//HttpContext.Current.Cache.Insert("Aviso", aviso, null, DateTime.Now.AddMinutes(30), Cache.NoSlidingExpiration);			
		}

		private static void CarregarEndereco()
		{
			InformacaoInstitucional informacaoInstitucionalEndereco =
				InformacaoInstitucionalRepositorio.ObterPorId((int) InformacaoInstitucionalCampos.Endereco);

			string endereco = informacaoInstitucionalEndereco.Conteudo.Replace("\n", "<br />");

			//Escreve no cache.
			HttpContext.Current.Cache.Insert("Endereco", endereco, null, DateTime.Now.AddHours(12), Cache.NoSlidingExpiration);
		}

		private static void CarregarFrase()
		{
			//Obtem uma frase aleatoria.
			Frase fraseAleatoria = FraseRepositorio.ObterAleatoria(true);

			//Obtem os dados.
			bool dataFalecimentoNaoEhNula = fraseAleatoria.Autor.AnoFalecimento.HasValue;
			string virgula = dataFalecimentoNaoEhNula ? "," : String.Empty;
			string separadorData = dataFalecimentoNaoEhNula ? "-" : String.Empty;
			string anoFalecimento = dataFalecimentoNaoEhNula ? fraseAleatoria.Autor.AnoFalecimento.Value.Year.ToString() : String.Empty;

			string conteudo = fraseAleatoria.Conteudo.Length > ComprimentoMaximoConteudo
															? String.Concat(fraseAleatoria.Conteudo.Substring(0, ComprimentoMaximoConteudo), " ...")
															: fraseAleatoria.Conteudo;

			string autorDatas = String.Format("{0} ({1}{2} {3}{4}{5})", fraseAleatoria.Autor.Nome,
														fraseAleatoria.Autor.Observacao,
														virgula,
														fraseAleatoria.Autor.AnoNascimento.Year,
														separadorData,
														anoFalecimento);

			//Escreve no cache.
			HttpContext.Current.Cache.Insert("FraseId", fraseAleatoria.idFrase, null, DateTime.Now.AddHours(2), Cache.NoSlidingExpiration);
			HttpContext.Current.Cache.Insert("FraseAutorId", fraseAleatoria.Autor.idAutor, null, DateTime.Now.AddHours(2), Cache.NoSlidingExpiration);
			HttpContext.Current.Cache.Insert("FraseConteudo", conteudo, null, DateTime.Now.AddHours(2), Cache.NoSlidingExpiration);
			HttpContext.Current.Cache.Insert("FraseAutorDatas", autorDatas, null, DateTime.Now.AddHours(2), Cache.NoSlidingExpiration);
		} 
		#endregion
	}
}
